package com.ynny.project01.common;

import com.ynny.project01.exception.UserNotFoundException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.List;

// 统一处理控制器层（Controller）抛出的异常，避免重复的异常处理代码,直接返回JSON数据。
@RestControllerAdvice
/**
 * 全局异常处理器
 * 处理参数校验异常
 * @ExceptionHandler
 * 指定拦截的异常类型
 */
public class GlobalExceptionHandler {

    // 提取字段错误校验,字段名（getField()）,字段错误信息（getDefaultMessage()）
    // 触发条件：@Validated 或 @Valid
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public AjaxResult hVE(MethodArgumentNotValidException e) {
        HashMap<Object, Object> map = new HashMap<>();

        // 遍历BindingResult中的FieldError字段校验进map里
        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
        for (FieldError fieldError : fieldErrors) {
            map.put(fieldError.getField(), fieldError.getDefaultMessage());
        }
        // 调用错误方法,返回map和错误信息
        return AjaxResult.error(400, "参数校验异常：")
                .put("errors",map);
    }

    // 处理自定义异常
    @ExceptionHandler(UserNotFoundException.class)
    public AjaxResult hVE(UserNotFoundException e) {

        return AjaxResult.error(404, "用户不存在：")
                .put("data",e.getMessage());
    }

    // 兜底,未被其他处理的异常
    // e.getMessage()可能暴露内部信息，需要处理
    @ExceptionHandler(Exception.class)
    public AjaxResult hVE(Exception e) {

        return AjaxResult.error(500, "系统异常：")
                .put("message",e.getMessage());
    }


}